using UnityEngine;

/// <summary>
/// 控制鱼类精灵在XZ平面上移动的组件（适用于已沿X轴旋转90度的精灵）
/// 功能：通过A/D键控制左右移动，保持在XZ平面内运动
/// 使用方法：
/// 1. 将脚本挂载到鱼对象上
/// 2. 添加Rigidbody组件（确保Use Gravity未勾选）
/// 3. 在Inspector面板设置移动速度
/// 4. 确保鱼对象已沿X轴旋转90度（使精灵面向Z轴正方向）
/// </summary>
[RequireComponent(typeof(Rigidbody), typeof(SpriteRenderer))]
public class FishMovementXZ : MonoBehaviour
{
    [Header("移动参数")]
    [Tooltip("移动速度（单位：米/秒），控制X轴方向移动速度")]
    public float moveSpeed = 5f;

    [Tooltip("是否允许Z轴自动漂移（模拟水流效果）")]
    public bool allowZDrift = false;

    [Tooltip("Z轴漂移速度（仅在allowZDrift启用时生效）")]
    public float zDriftSpeed = 1f;

    [Header("垂直移动与旋转参数")]
    [Tooltip("垂直移动速度（单位：米/秒），控制Z轴方向移动速度")]
    public float verticalMoveSpeed = 5f;

    [Tooltip("最大旋转角度（度），控制鱼头上下旋转的幅度")]
    public float maxRotationAngle = 15f;

    [Tooltip("旋转平滑速度，控制鱼头旋转的过渡效果")]
    public float rotationSmoothTime = 0.1f;

    private Rigidbody rb;
    private SpriteRenderer spriteRenderer;
    private float lastHorizontalInput = 1f; // 记录最后水平输入方向，初始化为1（向右）

    /// <summary>
    /// 初始化组件和物理约束
    /// </summary>
    private void Awake()
    {
        // 获取Rigidbody组件
        rb = GetComponent<Rigidbody>();
        spriteRenderer = GetComponent<SpriteRenderer>();

        // 配置物理约束：只允许XZ平面移动，冻结Y轴和旋转
        // 配置物理约束：只允许XZ平面移动，冻结Y轴位置和XZ轴旋转，允许Y轴旋转用于鱼头朝向
        rb.constraints = RigidbodyConstraints.FreezePositionY | 
                         RigidbodyConstraints.FreezeRotationX | 
                         RigidbodyConstraints.FreezeRotationY;

        // 禁用重力影响
        rb.useGravity = false;
    }

    /// <summary>
    /// 处理输入和移动逻辑
    /// </summary>
    private void FixedUpdate()
    {
        // 获取A/D键输入（水平轴）
        // 获取输入轴
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        // 计算X轴移动方向（左右移动）
        float xMovement = horizontalInput * moveSpeed;

        // 根据水平输入翻转精灵朝向
        if (horizontalInput != 0)
        {
            lastHorizontalInput = horizontalInput; // 更新最后水平输入方向
            spriteRenderer.flipX = horizontalInput < 0;
        }

        // 计算Z轴移动：优先使用垂直输入，否则使用漂移或保持当前速度
        float zMovement;
        if (Mathf.Abs(verticalInput) > 0.1f)
        {
            zMovement = verticalInput * verticalMoveSpeed;
        }
        else
        {
            zMovement = 0f; // 停止按WS时停止Z轴移动，忽略漂移设置
        }

        // 应用最终速度到Rigidbody
        rb.velocity = new Vector3(xMovement, 0f, zMovement);

        // 计算目标旋转角度（基于垂直输入，反转角度方向以匹配直观操作）
        // 根据最后水平输入方向调整旋转角度
        float rotationDirection = (lastHorizontalInput < 0) ? 1 : -1;
        float targetRotationAngle = -verticalInput * maxRotationAngle * rotationDirection;
        // 保留初始X轴旋转值，只修改Z轴旋转（鱼头上下倾斜）
        Quaternion targetRotation = Quaternion.Euler(transform.rotation.eulerAngles.x, 0f, targetRotationAngle);

        // 平滑旋转到目标角度
        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSmoothTime * Time.fixedDeltaTime * 60f);
    }

    /// <summary>
    /// Gizmos绘制：在Scene视图显示移动方向指示器
    /// </summary>
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.cyan;
        // 绘制X轴移动方向（左右）
        Gizmos.DrawLine(transform.position, transform.position + Vector3.right * 1f);
        // 绘制Z轴方向（鱼头朝向）
        Gizmos.DrawLine(transform.position, transform.position + Vector3.forward * 1f);
    }
}